class Personale < ActiveRecord::Base
  include ProssimeVisiteMediche
  acts_as_paranoid unless SHOW_DELETED
  has_attached_file :foto, :whiny => false,
    :styles => { :medium => "320x240>", :thumbnail => [ "60x60>", :jpg ] }

  SEX = %w(M F)
  STATO_CIVILE = ["celibe/nubile", "coniugato/a - convivente", "separato/a - divorziato/a", "vedovo/a"]

  belongs_to :metodo_pagamento
  has_one :taglie_personale, :dependent => :protect
  has_many :coordinate_bancarie, :as => :coordinate_bancarie_ref, :dependent => :protect
  has_many :indirizzi_aggiuntivi, :as => :indirizzo_aggiuntivo_ref, :dependent => :protect, :class_name => 'IndirizzoAggiuntivo'
  has_many :assenze_personale, :dependent => :protect, :class_name => 'AssenzaPersonale'
  has_many :visite_mediche, :dependent => :protect, :class_name => 'VisitaMedica'
  has_many :rapporti_di_lavoro, :dependent => :protect, :class_name => "RapportoDiLavoro"
  # movimenti magazzino
  #has_many :movimenti_magazzino, :as => :riferimento, :dependent => :protect, :class_name => "MovimentoMagazzino"
  #has_many :dettagli_movimento_magazzino, :through => :movimenti_magazzino, :dependent => :protect, :class_name => "DettaglioMovimentoMagazzino"
  # /movimenti magazzino
  has_many :allegati, :as => :allegato_ref, :dependent => :destroy
  has_many :note, :as => :nota_ref, :dependent => :protect
  has_many :requisiti_formativi_personale, :dependent => :protect, :class_name => "RequisitoFormativoPersonale"
  has_and_belongs_to_many :mansioni, :join_table => 'mansioni_personale', :uniq => true
  has_and_belongs_to_many :rapporto_giornaliero_lavori, :join_table => 'rapporto_giornaliero_lavori_personale', :uniq => true, :class_name => 'RapportoGiornalieroLavoro'
  has_and_belongs_to_many :eventi_formativi, :join_table => 'eventi_formativi_personale', :uniq => true, :class_name => 'EventoFormativo'

  validates_presence_of :cognome, :nome
  validates_uniqueness_of :cognome, :scope => [:nome, :deleted_at], :case_sensitive => false
  validates_numericality_of :cap, :allow_nil => true
  validates_inclusion_of :sesso, :in => SEX, :allow_nil => true
  validates_inclusion_of :stato_civile, :in => STATO_CIVILE, :allow_nil => true
  validates_length_of :codice_fiscale, :is => 16, :allow_nil => true
  validates_format_of :codice_fiscale,
    :with => /^([a-zA-Z]{6})([0-9]{2})([a-zA-Z]{1})([0-9]{2})([a-zA-Z]{1})([0-9]{3})([a-zA-Z]{1})$/,
    :allow_nil => true
  validates_attachment_content_type :foto, :content_type => ['image/jpeg', 'image/png', 'image/tiff']
  validates_attachment_size :foto, :less_than => 3.megabytes

  def name
    "#{cognome} #{nome}"
  end

  def matricola
    #cerco il rapporto di lavoro più recente escludendo i collaboratori (tipo_rapporto_di_lavoro_id = 5)
    rapporto = rapporti_di_lavoro.first(:conditions => 'tipo_rapporto_di_lavoro_id != 5', :order => 'data_inizio DESC')
    rapporto.matricola unless rapporto.nil?
  end

  def data_assunzione
    rapporto = rapporti_di_lavoro.first(:conditions => {:matricola => matricola}, :order => 'data_inizio ASC')
    rapporto.data_inizio unless rapporto.nil?
  end

  def qualifica
    rapporto = rapporti_di_lavoro.first(:conditions => 'tipo_rapporto_di_lavoro_id != 5', :order => 'data_inizio DESC')
    if ! rapporto.nil?
      return rapporto.posizione_inail.qualifica unless rapporto.posizione_inail.nil?
    end
  end

  def centri_costo
    centri_costo = Array.new
    mansioni.map {|i|
      centri_costo += [i.centro_costo.name] unless i.centro_costo.nil?
    }
    return centri_costo.uniq.sort.join(", ")
  end

  def attivo
    if ! rapporti_di_lavoro.empty?
      if rapporti_di_lavoro.first(:order => 'data_inizio DESC').data_fine.nil? or
        rapporti_di_lavoro.first(:order => 'data_inizio DESC').data_fine >= Date.today
       return true
      end
    else
     return false
    end
  end 

  def visita_generale
    prossima_visita(1)
  end
  def ematochimici
    prossima_visita(2)
  end
  def spirometria
    prossima_visita(3)
  end
  def audiometria
    prossima_visita(4)
  end
  def drug_test
    prossima_visita(5)
  end
end
